package cn.lishiyuan.algorithm.bit;

/**
 * 位图
 */
public class BitMap {

    private final long[] bits;

    private final int size;


    public BitMap(int size) {
        this.bits = new long[size];
        this.size = 64 * size;
    }

    // 反转
    public void flip(long index) {
        // 防止溢出
        index = index % size;
        int wordIndex = (int) (index / 64);     // 确定在哪个 long 元素里
        long bitIndex = index % 64;      // 确定在这个 long 中的哪一位
        bits[wordIndex] ^= (1L << bitIndex);  // 设置这一位为 1
    }

    public int set(long index) {
        // 防止溢出
        index = index % size;
        int wordIndex = (int) (index / 64);     // 确定在哪个 long 元素里
        long bitIndex = index % 64;      // 确定在这个 long 中的哪一位
        bits[wordIndex] |= (1L << bitIndex);  // 设置这一位为 1
        return 1;
    }

    public int get(long index) {
        // 防止溢出
        index = index % size;
        int wordIndex = (int) (index / 64);     // 确定在哪个 long 元素里
        long bitIndex = index % 64;      // 确定在这个 long 中的哪一位
        long l = bits[wordIndex] & (1L << bitIndex);// 设置这一位为 1
        return l!=0 ? 1 : 0;
    }

    public boolean getBoolean(long index) {
        return get(index) == 1;
    }
}
